#include <iostream>
#include <typeinfo>
#include <cassert>
#include <any>

// class Any
// {
// private:
//     class holder
//     {
//     public:
//         virtual ~holder() {}
//         virtual const std::type_info& type() = 0;
//         virtual holder *clone() = 0;
//     };

//     template <class T>
//     class placehold : public holder
//     {
//     public:
//         placehold(const T &val)
//             : _val(val)
//         {
//         }

//         virtual const std::type_info& type()
//         {
//             return typeid(T);
//         } // 获取子类对象保存的数据类型
//         virtual holder *clone()
//         {
//             return new placehold<T>(_val);
//         } // 针对当前的对象自身， 克隆出一个新的子类对象。

//     public:
//         T _val;
//     };

//     holder *_content;

// public:
//     Any()
//         : _content(nullptr)
//     {
//     }

//     template <class T>
//     Any(const T &val)
//         : _content(new placehold<T>(val))
//     {
//     }
//     Any(const Any &other)
//         : _content(other._content == nullptr ? nullptr : other._content->clone())
//     {
//     }
//     ~Any() 
//     {
//         delete _content;   
//     }

//     Any& swap(Any& other)
//     {
//         std::swap(_content, other._content);
//         return *this; 
//     }

//     template <class T>
//     T *get() 
//     {
//         assert(typeid(T) == _content->type());
//         return &(((placehold<T>*)_content)->_val);
//     } /*返回子类对象保存的数据指针*/

//     template <class T>
//     Any &operator=(const T &val) /*赋值运算符重载函数*/
//     {
//         Any tmp = Any(val);
//         tmp.swap(*this);

//         return *this;
//     }

//     Any &operator=(const Any &val) /*赋值运算符重载函数*/
//     {
//         Any tmp = Any(val);
//         tmp.swap(*this);

//         return *this;
//     }
// };  


// class Test
// {
// public:
//     Test()
//     {
//         std::cout << "构造函数" << std::endl;
//     }

//     ~Test()
//     {
//         std::cout << "析构函数" << std::endl;
//     }
// };

int main()
{               
    std::any a;
    a = 10;

    int *pi = std::any_cast<int>(&a);

    std::cout << *pi << std::endl;
    a = std::string("nihao");
    std::string str = std::any_cast<std::string>(a);
    std::cout << str << std::endl;
    return 0;
}